package es.javamyadmin.dao;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import es.javamyadmin.modelo.Tables;
import es.javamyadmin.pojo.Error;
import es.javamyadmin.pojo.Mensaje;
/**
 * Clase con los distintos metodos para trabajar con las BASES DE DATOS de MySQL.
 * @author Emilio Javier Castillo Gonzalez
 * @author Hector Delgado Duran
 *
 */
public class PersonalizadaDAO {
	String database = null;
	String user = null;
	String pass = null;
	String server = null;
	String puerto = null;
	String query  = null;
	String errorQuery = null;
	Connection conexion = null;
	Statement estamento = null;
	PreparedStatement preparada = null;
	ResultSet resultado = null;
	
	InputStream path = null;
	
	/**
	 * Metodo que ejecuta la query
	 * @return Collection
	 */
	public Collection<Tables> query(){
		Collection<Tables> listaDeListas = new ArrayList<Tables>();

		try {
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+server+":"+puerto+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement(query);
      	    resultado = pstm.executeQuery();
      	    int numeroColumnas;
      	    boolean priemeraVez = true;
			while(resultado.next()){
				numeroColumnas = resultado.getMetaData().getColumnCount();
				if(priemeraVez){
					Collection<Tables> cabecera = new ArrayList<Tables>();
					for(int i = 1; i <= numeroColumnas; i++){
						Tables tab = new Tables();
						tab.setContenido(resultado.getMetaData().getColumnName(i));
						cabecera.add(tab);
					}
					Tables li = new Tables();
					li.setSelect(cabecera);
					listaDeListas.add(li);
					priemeraVez = false;
				}
				Collection<Tables> listaDatos = new ArrayList<Tables>();
				Tables listaSelect = new Tables();
				for(int i = 1; i <= numeroColumnas; i++){
					Tables tab = new Tables();
					tab.setContenido(resultado.getString(i));
					listaDatos.add(tab);
				}
				listaSelect.setSelect(listaDatos);
				listaDeListas.add(listaSelect);
			}
		} catch(SQLException ex){
			ex.printStackTrace();
			errorQuery = Mensaje.getMensaje(path, String.valueOf(ex.getErrorCode()));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return listaDeListas;		
	}
	
	
	
	
	/**
	 * Metodo que ejecuta la query
	 * @return
	 */
	public Error update(){
		Error err = null;
		try {
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+server+":"+puerto+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement(query);
      	    System.out.println(query);
      	    int i = pstm.executeUpdate();
      	  	System.out.println("devolucion update ->"+i);
      	   if(i<1){
      	    	err = new Error(null,null,Mensaje.getMensaje(path, "5003"));
      	    }else{
      	    	if(i == 1){
      	    		err = new Error(null,null,Mensaje.getMensaje(path, "5003"));
      	    	}else{
      	    		err = new Error(null,null,Mensaje.getMensaje(path, "5003") + ". Se han efectuado " + i + " cambios");
      	    	}
      	    }
		} catch(SQLException ex){
			err = new Error(Mensaje.getMensaje(path, String.valueOf(ex.getErrorCode())),ex.getMessage().replace("'", ""),"");
			if(err.getError() == null){
				err.setError(Mensaje.getMensaje(path, "5005"));
			}
			ex.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally {
			cerrarConexion();
		}
		return err;
	}
	
	
	/**
	 * @return the errorQuery
	 */
	public String getErrorQuery() {
		return errorQuery;
	}


	/**
	 * @param errorQuery the errorQuery to set
	 */
	public void setErrorQuery(String errorQuery) {
		this.errorQuery = errorQuery;
	}





	/**
	 * @return the database
	 */
	public String getDatabase() {
		return database;
	}

	/**
	 * @param database the database to set
	 */
	public void setDatabase(String database) {
		this.database = database;
	}

	/**
	 * @return the user
	 */
	public String getUser() {
		return user;
	}

	/**
	 * @param user the user to set
	 */
	public void setUser(String user) {
		this.user = user;
	}

	/**
	 * @return the pass
	 */
	public String getPass() {
		return pass;
	}

	/**
	 * @param pass the pass to set
	 */
	public void setPass(String pass) {
		this.pass = pass;
	}

	/**
	 * @return the server
	 */
	public String getServer() {
		return server;
	}

	/**
	 * @param server the server to set
	 */
	public void setServer(String server) {
		this.server = server;
	}

	/**
	 * @return the puerto
	 */
	public String getPuerto() {
		return puerto;
	}

	/**
	 * @param puerto the puerto to set
	 */
	public void setPuerto(String puerto) {
		this.puerto = puerto;
	}

	/**
	 * @return the query
	 */
	public String getQuery() {
		return query;
	}

	/**
	 * @param query the query to set
	 */
	public void setQuery(String query) {
		this.query = query;
	}

	/**
	 * @return the path
	 */
	public InputStream getPath() {
		return path;
	}

	/**
	 * @param path the path to set
	 */
	public void setPath(InputStream path) {
		this.path = path;
	}
	
	/**
	 * Metodo que cierra la conexion a la base de datos
	 */
	public void cerrarConexion(){
		if(resultado != null){
			try {
				resultado.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			resultado = null;
		}
		if(estamento != null){
			try {
				estamento.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			estamento = null;
		}
		if(preparada != null){
			try {
				preparada.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			preparada = null;
		}
		if(conexion != null){
			try {
				conexion.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			conexion = null;
		}
	}

	
	
	
	
	
}
